package org.example.xsda.dto;

import lombok.Data;
import java.util.ArrayList;
import java.util.List;

/**
 * 导入结果DTO
 */
@Data
public class ImportResultDTO {
    
    /**
     * 导入是否成功（整体）
     */
    private Boolean success;
    
    /**
     * 总记录数
     */
    private Integer totalCount;
    
    /**
     * 成功数
     */
    private Integer successCount;
    
    /**
     * 失败数
     */
    private Integer failCount;
    
    /**
     * 成功率
     */
    private Double successRate;
    
    /**
     * 失败数据详情列表
     */
    private List<FailDetail> failDetails = new ArrayList<>();
    
    /**
     * 失败数据文件URL
     */
    private String failFileUrl;
    
    /**
     * 消息提示
     */
    private String message;
    
    /**
     * 失败详情
     */
    @Data
    public static class FailDetail {
        /**
         * 行号
         */
        private Integer rowNumber;
        
        /**
         * 学号
         */
        private String studentNo;
        
        /**
         * 姓名
         */
        private String name;
        
        /**
         * 错误原因
         */
        private String errorReason;
        
        /**
         * 原始数据预览
         */
        private String dataPreview;
    }
    
    /**
     * 计算成功率
     */
    public void calculateSuccessRate() {
        if (totalCount != null && totalCount > 0) {
            this.successRate = (double) successCount / totalCount * 100;
            // 保留1位小数
            this.successRate = Math.round(successRate * 10) / 10.0;
        } else {
            this.successRate = 0.0;
        }
    }
    
    /**
     * 生成消息
     */
    public void generateMessage() {
        if (failCount == 0) {
            this.success = true;
            this.message = String.format("导入成功！共导入%d条数据", successCount);
        } else if (successCount > 0) {
            this.success = true;
            this.message = String.format("部分导入成功！成功%d条，失败%d条，请查看失败详情", successCount, failCount);
        } else {
            this.success = false;
            this.message = String.format("导入失败！共%d条数据全部失败，请查看失败详情", totalCount);
        }
    }
}

